//
// Created by Creat on 2024/5/23.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
/*
 * 1. 统计不同元素出现次数
 * 2. 记录每个元素每次出现的位置
 * 3. 枚举元素X，窗口[i,j]在元素出现位置所在列表滑动，需要删除的数量即为 aj - ai - (j - i)
 * */
int longestEqualSubarray(int* nums, int numsSize, int k){
    int cnt[numsSize + 1]; // 变长数组统计数字数量
    int *pos[numsSize + 1];  // 变长指针数组记录每个数字出现位置
    int arrSize[numsSize + 1]; // 变长数组，存储每个数字出现时是第几个该数字
    // 初始化
    memset(cnt, 0, sizeof(cnt));
    memset(pos, 0, sizeof(pos));
    memset(arrSize, 0, sizeof(arrSize));
    // 统计出现次数
    for(int i = 0;i < numsSize;i++){
        cnt[nums[i]]++;
    }
    // 记录出现位置
    for(int i = 0;i < numsSize;i++){
        int x = nums[i];
        if(pos[x] == NULL)
            pos[x] = (int*)malloc(sizeof(int) * cnt[x]);
        pos[x][arrSize[x]++] = i;
    }
    int ans = 0; // 结果
    for(int x = 0;x <= numsSize;x++){
        for(int i = 0, j = 0;i < cnt[x];i++){
            while(pos[x][i] - pos[x][j] - (i - j) > k)
                j++;
            ans = fmax(ans, i - j + 1);
        }
    }
    for(int i = 0;i <= numsSize;i++)
        free(pos[i]);
    return ans;
}
//int main(void){
//    int nums[] = [1,3,2,3,1,3];
//    int k = 3;
//    printf("%d", longestEqualSubarray(nums,sizeof (nums) / sizeof (int), k));
//    return 0;
//}